﻿#ifndef IDevice_H
#define IDevice_H

// 判断是否为 DLL 导出或导入

// Qt 的方式来处理 DLL 导出/导入
#if defined(DEVICE_LIBRARY)
#  define DEVICE_EXPORT Q_DECL_EXPORT
#else
#  define DEVICE_EXPORT Q_DECL_IMPORT
#endif

#include <QString>
#include <QWidget>
#include <QList>
#include <QVector>
#include "CAlarmPoint.h"
// ===============================
// IDevice 接口类（抽象设备插件）
// ===============================
// 所有设备插件都应实现此接口，提供统一的设备控制方式
// 插件将通过工厂函数 createDevice/destroyDevice 创建和销毁
struct  SDeviceConfig
{
	QString sDeviceName;   //设备名称
	QString sDeviceId;     //设备id
	QString sConfig;
	QWidget* pWidget;     //关联输入设备界面
	SDeviceConfig()
	{
		sDeviceName = "";
		sDeviceId = "";
		sConfig = "";
		pWidget = nullptr;
	}
	~SDeviceConfig() {};
};

class DEVICE_EXPORT IDevice
{
public:
	// 虚析构，确保通过接口删除派生类时调用正确的析构函数
	virtual ~IDevice() {}

	// 获取该设备的底层对象（可用于信号槽连接等）
	virtual QObject* getDeviceObject() = 0;

	// 启动设备，例如打开串口、初始化连接等
	virtual bool startDevice() = 0;

	// 停止设备，关闭资源
	virtual void stopDevice() = 0;
	//删除设备
	virtual void deleteDevice() = 0;
	// 向设备发送命令，命令格式由设备自行定义
	virtual bool controlDevice(const QString& cmd) = 0;

	// 获取当前设备状态（例如“运行中”、“故障”、“未连接”）
	virtual QString getDeviceStatus() const = 0;

	// 获取设备支持的测点名称列表（如电压、电流、温度等）
	virtual QList<CMeasurePoint*> getMeasurePoints() const = 0;
	// 设置报警区域（格式、含义由设备自定义）
	virtual void setAlarmArea(const QString& area) = 0;

	// 获取设备的运行日志或事件记录
	virtual QList<QString> getDeviceLogs() const = 0;

	// 获取设备配置界面，用于参数设置等（返回 Qt 界面指针）
	virtual QWidget* getDeviceConfigUi() = 0;

	// 获取设备运行界面，用于展示实时数据、状态等
	virtual QWidget* getDeviceRunUi() = 0;

	// 获取设备缩略图界面，用于总览展示或轮播
	virtual QWidget* getDeviceThumbnailUi(int nId = 0) = 0;

	// 获取设备缩略图界面列表，用于总览展示或轮播
	virtual QVector<QWidget*> getDeviceUiList() = 0;

	// 获取设备输入测点列表
	virtual QMap<QString, QString> getInputPointList()= 0;

	// 设置设备输入测点列表
	virtual void setInputPointList(QMap<QString, CMeasurePoint*>vecInputPoint) = 0;


public:
	SDeviceConfig* m_pDeviceConfig;
};

// ===============================
// 插件导出函数（C 接口，避免 C++ 名字修饰）
// ===============================
extern "C" DEVICE_EXPORT IDevice* createDevice(SDeviceConfig* pDevice);
extern "C" DEVICE_EXPORT QVector<IDevice*>* createDevices(SDeviceConfig* pDevice);
extern "C" DEVICE_EXPORT void destroyDevice(IDevice* dev);
extern "C" DEVICE_EXPORT QVector<QString>*  getModelList(); 
extern "C" DEVICE_EXPORT QVector<QWidget*>*  getPublicCardList();
extern "C" DEVICE_EXPORT QWidget*  getPublicCard(int nCardId,QString* psCardGuid);

#endif